#!/bin/sh
MOD_NAME=virtualhere
MOD_BINARY=vhusbdarm
MOD_CONFIG=/run/$MOD_NAME/config.ini
MOD_CA_PEM=/run/$MOD_NAME/ca.pem
MOD_SERVER_PEM=/run/$MOD_NAME/server.pem
MOD_DEFAULTS=/opt/$MOD_NAME/etc/defaults
MOD_SETTINGS=/opt/$MOD_NAME/etc/settings
MOD_OS_RELEASE=/etc/os-release

[ -L "$MOD_SETTINGS" ] && MOD_SETTINGS=`readlink $MOD_SETTINGS`
[ -f "$MOD_SETTINGS" ] || cp $MOD_DEFAULTS $MOD_SETTINGS
[ -x "/sbin/hash_verify" ] && [ ! -f "$MOD_SETTINGS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash
. $MOD_SETTINGS

. /etc/rc.d/init.d/functions
if [ -f /etc/settings.uport ]; then
  . /etc/settings.uport
elif [ -f /etc/settings.port ]; then
  . /etc/settings.port
else
  logger -t virtualhere -p warn "Unable to configure USB port"
fi

# Adds configuration
#   $1   name of the configuration
#   $2   value of the configuration
add_config() {
  if [ ! -z "$2" ]; then
    echo "$1=$2" >> $MOD_CONFIG
  fi
}

# Saves certificate to file
# Input param:
#   $1   path to the certificate file
#   $2   base64 encoded certificate string
#   $3   append cetificate
save_cert() {
  if [ ! -z "$2" ]; then
    if $3; then
        decode $2 >> $1
    else
        decode $2 > $1
    fi
  fi
}

# Gets platform name
# Outputs:
#  Print platform name (v2i, v3, v4, v4i) if exists otherwise empty string is returned.
# Exit status:
#  Return 0 in any case
get_platform() {
  grep ICR_PLATFORM= /etc/os-release 2> /dev/null | sed s/ICR_PLATFORM=//
}

# Gets ignore list according used platform
# Input param:
#  $1 platform name (v2i, v3, v4, v4i)
#  Outputs:
#  Returns list of ignored devices when expected platform is passed otherwise empty string is returned
# Exit status:
#  Return 0 when expected platform is returned otherwise 1 is returned
get_ignore_list(){
  if [ -z $1 ]; then
    logger -t virtualhere -p 3 "Unknown undefined";
    echo ""
    return 1
  fi
  # v2i and v2i-S1
  if [ $1 == 'v2i' ]; then
    echo "05c6/9025,1076/9003,1076/9082,1199/68c0,1508/1001,1bc7/1031,1bc7/1033,1bc7/1040,1e0e/9205,1e0e/9206,1e2d/0060,1e2d/0061,1e2d/0065,1e2d/0068,1e2d/0069,1e2d/006b,1e2d/006f,2c7c/0125,2c7c/0296,2c7c/0700"
    return 0
  fi
  if [ $1 == 'v3' ]; then
    echo "0424/9e00,05c6/3197,05c6/9025,1076/9003,1076/9082,1199/68a2,1199/68c0,1199/9091,12d1/14f1,12d1/15c1,1410/a021,1508/1001,1bc7/1040,1e2d/0060,1e2d/0061,1e2d/0068,1e2d/0069,1e2d/006b,1e2d/006f,1e0e/9205,1e0e/9206,2692/9003,2692/9005,2c7c/0125,2c7c/0296,2c7c/0700"
    return 0
  fi
  if [ $1 == 'v4' ]; then
    echo "045e/0745,04f2/b74f,0cf3/3004,0cf3/e300,062a/4101,06cb/00f9,1199/9091,1bc7/1050,1bc7/1051,1bc7/1070,1bc7/1071,2cb7/0104,2c7c/030a,2c7c/0512,2c7c/0620,2c7c/0800,2c7c/0801,2c7c/0900,8087/0026,1e2d/0065,1e2d/00b3"
    return 0
  fi
  if [ $1 == 'v4i' ]; then
    echo "0cf3/e600,1199/9091,1bc7/1050,1bc7/1051,1bc7/1070,1bc7/1071,1bc7/1201,2cb7/0104,2c7c/0801,2c7c/0900,1e2d/00b3"
    return 0
  fi

  logger -t virtualhere -p 3 "Bad platform: $1";
  echo ""
  return 1
}

# Saves ignore list according used platform
# Leaves without ignore list when platform is unknown
# Input param:
#  $1 platform name (v2i, v3, v4, v4i)
# Exit status:
#  0 if platform is known
#  1 if platform is unknown
save_ignore_list() {
  LIST=$(get_ignore_list $1)

  if [ ! -z $LIST ]; then 
    echo "IgnoredDevices=$LIST" >> $MOD_CONFIG
    return 0
  fi
  return 1
  unset LIST
}

mkdir -p $(dirname $MOD_CONFIG)
> $MOD_CONFIG

add_config "Hostname" $MOD_VH_HOST_NAME
add_config "ServerName" \$HOSTNAME\$
add_config "License" $MOD_VH_LICENSE


if [ ! -z $MOD_VH_LICENSE ]; then
  add_config "SSLUseClientCerts" $MOD_VH_USE_CLIENT_CERTS
  if [ ! -z $MOD_VH_CA_CERT ]; then
    add_config "SSLCAFile" $MOD_CA_PEM
  fi
  if [ ! -z $MOD_VH_LOCAL_CERT ] && [ ! -z $MOD_VH_LOCAL_KEY ]; then
    add_config "SSLCert" $MOD_SERVER_PEM
  fi

  if [ $MOD_VH_USE_CLIENT_CERTS -eq 1 ]; then
    add_config "SSLPort" $MOD_VH_PORT
  else
    add_config "TCPPort" $MOD_VH_PORT
  fi
fi

# Save CA cert to file
save_cert $MOD_CA_PEM $MOD_VH_CA_CERT false
save_cert $MOD_SERVER_PEM $MOD_VH_LOCAL_KEY false
save_cert $MOD_SERVER_PEM $MOD_VH_LOCAL_CERT true

save_ignore_list $(get_platform)

case "$1" in
  start|restart)
    [ -x "/sbin/hash_verify" ] && ! hash_verify $MOD_SETTINGS && exit 1
    if [ "$1" = "restart" ]; then
      echo -n "Restarting module $MOD_NAME: "
      daemon_stop $MOD_BINARY
    else
      echo -n "Starting module $MOD_NAME: "
    fi
    if [ "$MOD_VH_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi
    daemon_start $MOD_BINARY -b -c $MOD_CONFIG
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
    ;;
  stop)
    echo -n "Stopping module $MOD_NAME: "
    daemon_stop $MOD_BINARY
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
    ;;
  status)
    echo -n "Module $MOD_NAME is "
    killall -0 $MOD_BINARY 2> /dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo -n "running"; else echo -n "stopped"; fi
    echo -n ", USB port is "
    if [ $UPORT_PORT1_ENABLED = 1 ]; then echo "enabled"; else echo "disabled"; fi
    exit $RETVAL 
    ;;
  defaults)
  cp $MOD_DEFAULTS $MOD_SETTINGS 2> /dev/null
    [ -f "$MOD_DEFAULTS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash
	;;
  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
esac
